﻿using SienSchoofsProject.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;
using System.IO;
using SienSchoofsProject.Helpers;

namespace SienSchoofsProject.Controllers
{
    public class HomeController : BaseController
    {
        FilmDb _db = new FilmDb();

        public ActionResult Autocomplete(string term)
        {
            try
            {
            var model =
                _db.Films
                    .Where(r => r.Name.Contains(term)) //waar de naam de term bevat (eender waar in de naam dus)
                    .Take(10)
                    .Select(r => new
                    {
                        label = r.Name
                    });
            return Json(model, JsonRequestBehavior.AllowGet);
        }
            catch (Exception e)
            {
                //Server.MapPath("~") = de root-map van het project
                string pad = Server.MapPath("~") + "/Logging/Log.txt";
                if (!System.IO.File.Exists(pad))
                {
                    System.IO.File.Create(pad);
                }

                using (StreamWriter swTracing = System.IO.File.AppendText(pad))
                {
                    swTracing.Write("\n\nDatum/Tijd: " + DateTime.Now + "\nException:\n" + e.StackTrace);
                }
            }
            return View();
        }

        public ActionResult Index(string searchTerm = null, int page = 1)
        {
           
            var model =
                    _db.Films
                        .OrderByDescending(r => r.Reviews.Average(review => review.Rating))
                        .Where(r => searchTerm == null || r.Name.Contains(searchTerm)) 
                        .Select(r => new FilmListViewModel
                        {
                            Id = r.Id,
                            Name = r.Name,
                            Year = r.Year,
                            Director = r.Director,
                            CountOfReviews = r.Reviews.Count(),
                            AverageOfReviews = r.Reviews.Average(review => review.Rating) == null ? 0 : r.Reviews.Average(review => review.Rating)
                        }).ToPagedList(page, 10);

            if (Request.IsAjaxRequest())
            {
                return PartialView("_Films", model);
            }

            return View(model);
        
        }

        public ActionResult About()
        {
            try
            {         
            return View();
        }
            catch (Exception e)
            {
                //Server.MapPath("~") = de root-map van het project
                string pad = Server.MapPath("~") + "/Logging/Log.txt";
                if (!System.IO.File.Exists(pad))
                {
                    System.IO.File.Create(pad);
                }

                using (StreamWriter swTracing = System.IO.File.AppendText(pad))
                {
                    swTracing.Write("\n\nDatum/Tijd: " + DateTime.Now + "\nException:\n" + e.StackTrace);
                }
                return View();
            }
        }

        /// <summary>
        /// Methode voor het aanpassen van de culture.
        /// 
        /// Dit gebeurt door de waarde van de vlaggen knoppen op te halen,
        /// welke culture values zijn, en deze vervolgens in de _culture cookie 
        /// te steken, welke dan uitgelezen zal worden door de base controller.
        /// </summary>
        /// <param name="culture">de value van een vlag knop, welke een culture is zoals nl-BE</param>
        /// <returns></returns>
        [HttpPost]
        [AllowAnonymous]
        public ActionResult SetCulture(string culture)
        {
            try
            {
                // Controleer de invoer met de helper
                culture = CultureHelper.GetImplementedCulture(culture);
                // Sla de culture op in een cookie
                HttpCookie cookie = Request.Cookies["_culture"];
                if (cookie != null)
                    cookie.Value = culture;   // cookie waarde aanpassen indien deze reeds bestaat
                else
                {
                    cookie = new HttpCookie("_culture");
                    cookie.Value = culture;
                    cookie.Expires = DateTime.Now.AddYears(1);
                }
                Response.Cookies.Add(cookie);
            }
            catch (Exception e)
            {
                string pad = Server.MapPath("~") + "/Logging/Log.txt";
                if (!System.IO.File.Exists(pad))
                {
                    System.IO.File.Create(pad);
                }

                using (StreamWriter swTracing = System.IO.File.AppendText(pad))
                {
                    swTracing.Write("\n\nDatum/Tijd: " + DateTime.Now + "\nException:\n" + e.StackTrace);
                }                
            }

            //stuur de gebruiker terug naar home na het aanmaken/aanpassen van de cookie
            return RedirectToAction("Index", "Home");
        }                

        protected override void Dispose(bool disposing)
        {
            if (_db != null)
            {
                _db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
